/**
 * 工具业务服务 - 纯粹的工具执行网关
 * 职责：接收执行请求 -> 用户确认 -> 调用工具实例 -> 返回结果
 */

import { IAgentBus } from '../bus/IAgentBus';
// 修改点 1: 引用新的工具注册中心
import { getToolList, getToolHandler } from "./index";
import { selectFilesFromWorkspace } from '../utils/fileSelector';
import { ToolResult, Attachment } from "../types/types";

export class AgentToolGateway {


    constructor(private readonly bus: IAgentBus) {}

    /**
     * 获取所有可用工具定义
     * (直接从新注册中心获取)
     */
    public getToolList() {
        return getToolList();
    }

    /**
     * 安全执行工具（通用入口）
     * @param request 工具调用请求信息
     */
    public async requestToolExecution(request: { 
        id: string;         // 调用的唯一ID
        toolName: string;   // 工具 ID/Name
        args: any;          // 工具参数
    }): Promise<ToolResult> {
        
        const { id, toolName, args } = request;

        // 1. 获取工具处理器 (检查工具是否存在)
        const handler = getToolHandler(toolName);
        if (!handler) {
            return {
                callId: id,
                success: false,
                error: `Unknown tool: ${toolName}`,
                duration: 0
            };
        }

        // 2. 安全拦截：先询问用户是否同意
        const approved = await this.bus.requestConfirmation({
            id,
            name: handler.getDefinition().name, // 使用显示名称
            arguments: args
        });
        
        if (!approved) {
            return {
                callId: id,
                success: false,
                error: 'User rejected tool execution',
                duration: 0
            };
        }

        // 3. 用户同意，直接调用工具实例执行
        const result = await handler.execute(args, id);


        return result;
    }

    /**
     * 手动直接执行工具 (跳过确认)
     */
    public async executeToolDirectly(toolId: string, args?: Record<string, any>): Promise<ToolResult> {
        const callId = `manual_${Date.now()}`;
        
        const handler = getToolHandler(toolId);
        if (!handler) {
            return {
                callId,
                success: false,
                error: `Unknown tool: ${toolId}`,
                duration: 0
            };
        }

        // 直接执行
        const result = await handler.execute(args || {}, callId);


        return result;
    }

    /**
     * 请求用户选择工作区文件
     */
    public async requestFiles(): Promise<Attachment[] | undefined> {
        return await selectFilesFromWorkspace();
    }

}